package com.sms.util;

import com.sms.model.Course;
import com.sms.model.Score;
import com.sms.model.Student;
import com.sms.result.ValidationResult;

import java.util.ArrayList;
import java.util.List;

import static com.sms.constants.SystemConstants.*;

/**
 * 数据验证工具类
 * 位置：com.sms.util.ValidateUtil
 */
public final class ValidateUtil {
    /**
     * 验证学号格式
     *
     * @param id 学号  长度为7位
     * @return true-格式正确, false-格式错误
     */
    public static boolean isValidStudentId(String id) {
        return (id != null && id.matches(ID_PATTERN));
    }

    /**
     * 验证课程ID格式
     *
     * @param courseId 课程ID  格式[A-Z]\\d{3}
     * @return true-格式正确, false-格式错误
     */
    public static boolean isValidCourseId(String courseId) {
        return (courseId != null && courseId.matches(COURSE_ID_PATTERN));
    }

    /**
     * 验证成绩范围
     *
     * @param score 成绩 0-100
     * @return true-在有效范围内, false-超出范围
     */
    public static boolean isValidScore(double score) {
        return (score > MIN_SCORE && score <= MAX_SCORE);
    }

    /**
     * 验证年龄范围
     *
     * @param age 年龄 15-50
     * @return true-在有效范围内, false-超出范围
     */
    public static boolean isValidAge(int age) {
        return (age >= MIN_AGE && age <= MAX_AGE);
    }

    /**
     * 验证姓名范围
     *
     * @param name 姓名，2-10字符
     * @return true-在有效范围内, false-超出范围
     */
    public static boolean isValidName(String name) {
        return (name != null && (name.length() >= 2 && name.length() <= 10));
    }

    /**
     * 验证性别范围
     *
     * @param gender 性别，男或女
     * @return true-在有效范围内, false-超出范围
     */
    public static boolean isValidGender(String gender) {
        return (gender != null && (gender.equals("男") || gender.equals("女")));
    }


    /**
     * 验证性别范围
     *
     * @param credit 学分，0.5-10.0
     * @return true-在有效范围内, false-超出范围
     */
    public static boolean isValidCredit(double credit) {
        return (credit >= MIN_CREDIT && credit <= MAX_CREDIT);
    }

    /**
     * 验证学生对象数据完整性
     *
     * @param student 学生对象
     * @return 验证结果对象
     */
    public static ValidationResult validateStudent(Student student) {
        if (student == null) return new ValidationResult(false, "学生对象不能为null");

        List<String> errors = new ArrayList<>();
        if (!isValidStudentId(student.getId())) errors.add("学号格式不正确");
        if (!isValidAge(student.getAge())) errors.add("年龄必须在15-50岁之间");
        if (!isValidName(student.getName())) errors.add("姓名长度必须在2-10字符之间");
        if (!isValidGender(student.getGender())) errors.add("性别必须为'男'或'女'");

        return errors.isEmpty() ?
                new ValidationResult(true, "验证通过") :
                new ValidationResult(false, String.join("; ", errors));
    }

    /**
     * 验证课程对象数据完整性
     *
     * @param course 课程对象
     * @return 验证结果对象
     */
    public static ValidationResult validateCourse(Course course) {
        if (course == null) return new ValidationResult(false, "课程对象不能为null");

        List<String> errors = new ArrayList<>();
        if (!isValidCourseId(course.getCourseId())) errors.add("课程ID格式不正确");
        if (!isValidCredit(course.getCredit())) errors.add("学分必须在0.5-10.0之间");

        return errors.isEmpty() ?
                new ValidationResult(true, "验证通过") :
                new ValidationResult(false, String.join("; ", errors));
    }

    /**
     * 验证成绩对象数据完整性
     *
     * @param score 成绩对象
     * @return 验证结果对象
     */
    public static ValidationResult validateScore(Score score) {
        if (score == null) return new ValidationResult(false, "成绩对象不能为null");

        return isValidScore(score.getScore()) ?
                new ValidationResult(true, "验证通过") :
                new ValidationResult(false, "成绩必须在0-100分之间");
    }
}
